Memahami Data dengan Script Python#

Data understanding adalah tahap awal dalam analisis sains data di mana analis mengumpulkan, menjelajahi, dan menganalisis data untuk memahami bentuk, isi, dan kualitasnya, serta mengidentifikasi masalah seperti nilai yang hilang atau inkonsisten. Tujuan utamanya adalah untuk mendapatkan pemahaman mendalam tentang data agar dapat menyelaraskan data dengan tujuan bisnis dan memilih algoritma yang tepat untuk tahap pemodelan selanjutnya. Tahapan Utama dalam Data Understanding

  • Mengumpulkan Data Awal: Mengidentifikasi dan mengumpulkan data yang relevan untuk tujuan proyek, baik dari sumber internal perusahaan maupun eksternal.

  • Menjelajahi Data: Melakukan eksplorasi data untuk mendapatkan wawasan awal, memahami struktur, fitur, dan properti data. Ini melibatkan penggunaan statistik sederhana seperti rata-rata dan visualisasi data.

  • Memverifikasi Kualitas Data: Memeriksa data untuk mengidentifikasi potensi masalah seperti:

    • Nilai yang hilang: Mencari data yang tidak lengkap dan memahami alasannya.

    • Inkonsistensi atau nilai tidak valid: Mengidentifikasi data yang tidak sesuai atau salah.

    • Outlier: Mendeteksi nilai-nilai ekstrem yang menyimpang dari pola umum.

Membuat database MySQL#

Membuat database MySQL menggunakan phpmyadmin dari XAMPP sebagai tempat untuk menyimpan data iris dengan kolom : id, class, sepal_length, dan sepal_width

Langkah-langkah membuat database MySQL#

  1. Kunjungi laman admin MySQL (localhost/phpmyadmin/)

  2. Buat database baru image.png

  3. import dataset iris ke dalam database, setelah data dimasukkan scroll ke bawah kemudian klik impor Screenshot 2025-09-14 173728.png image.png

Membuat database PostgreSQL#

Membuat database PostgreSQL menggunakan pgAdmin4 dari postgresql.org sebagai tempat untuk menyimpan data iris dengan kolom : id, class, sepal_length, dan sepal_width

Langkah-langkah membuat database PostgreSQL#

  1. Download pdAdmin4 di postgresql.org/download, pilih intaslller yang sesuai dengan sistem operasi masing-masing dan intall setelah di download

  2. Buka pgAdmin4 yang telah di install, tambahkan tabel baru menggunakan Query Tool image.png

  3. Masukkan query utnuk membuat tabel baru

CREATE TABLE iris (
    id SERIAL PRIMARY KEY,
    class VARCHAR(50),
    petal_length NUMERIC(3,1),
    petal_width NUMERIC(3,1)
);
  1. Import dataset ke dalam tabel image.png

  2. Pilih file dataset iris yang akan dimasukkan kedalam database, jika sudah sesuai klik Ok Screenshot 2025-09-14 210724.png

  3. Berikut data yang telah berhasil di import image.png

Menarik Data ke Power BI#

Langkah-langkah menarik data MySQL#

  1. Install library yang digunakan untuk mengquery data dari Mysql yang di antaranya Pandas, pymysql, dan sqlalchemy pada environment PC/Laptop. pandas biasanya digunakan untuk mengolah dan menyajikan data dalam bentuk dataframe yang akan diperlukan oleh Power BI, pymysql merupakan driver khusus database MySQL yang digunakan untuk berkomunikasi dengan database, sedangkan sqlalchemy merupakan ibarat sebuah jembatan untuk koneksi database.

  2. Massuk ke Power BI, pilih Get Data pada menu Home untuk mendapatkan data image.png

  1. Pada menu Get Data pilih Other -> Pyhton Script, kemudian klik Connect image.png

  1. Masukkan script python untuk mengambil data iris yang ada di database MySQL. berikut script nya :

import pandas as pd
from sqlalchemy import create_engine

# Koneksi ke MySQL
MYSQL_HOST = "localhost"
MYSQL_PORT = 3306
MYSQL_USER = "root"
MYSQL_PASSWORD = ""
MYSQL_DATABASE = "iris"

# Gunakan SQLAlchemy untuk koneksi ke MySQL
mysql_engine = create_engine(
    f"mysql+pymysql://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}"
)

# Jalankan query
mysql_query = "SELECT * FROM iris;"
df_mysql = pd.read_sql(mysql_query, mysql_engine)

# Print hasil
print("Data dari MySQL:")
print(df_mysql.head())
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
/usr/local/lib/python3.12/dist-packages/pymysql/connections.py in connect(self, sock)
    660                         try:
--> 661                             sock = socket.create_connection(
    662                                 (self.host, self.port), self.connect_timeout, **kwargs

/usr/lib/python3.12/socket.py in create_connection(address, timeout, source_address, all_errors)
    864             if not all_errors:
--> 865                 raise exceptions[0]
    866             raise ExceptionGroup("create_connection failed", exceptions)

/usr/lib/python3.12/socket.py in create_connection(address, timeout, source_address, all_errors)
    849                 sock.bind(source_address)
--> 850             sock.connect(sa)
    851             # Break explicitly a reference cycle

OSError: [Errno 99] Cannot assign requested address

During handling of the above exception, another exception occurred:

OperationalError                          Traceback (most recent call last)
/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/base.py in __init__(self, engine, connection, _has_events, _allow_revalidate, _allow_autobegin)
    142             try:
--> 143                 self._dbapi_connection = engine.raw_connection()
    144             except dialect.loaded_dbapi.Error as err:

/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/base.py in raw_connection(self)
   3300         """
-> 3301         return self.pool.connect()
   3302 

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in connect(self)
    446         """
--> 447         return _ConnectionFairy._checkout(self)
    448 

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in _checkout(cls, pool, threadconns, fairy)
   1263         if not fairy:
-> 1264             fairy = _ConnectionRecord.checkout(pool)
   1265 

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in checkout(cls, pool)
    710         else:
--> 711             rec = pool._do_get()
    712 

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/impl.py in _do_get(self)
    176             except:
--> 177                 with util.safe_reraise():
    178                     self._dec_overflow()

/usr/local/lib/python3.12/dist-packages/sqlalchemy/util/langhelpers.py in __exit__(self, type_, value, traceback)
    223             self._exc_info = None  # remove potential circular references
--> 224             raise exc_value.with_traceback(exc_tb)
    225         else:

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/impl.py in _do_get(self)
    174             try:
--> 175                 return self._create_connection()
    176             except:

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in _create_connection(self)
    387 
--> 388         return _ConnectionRecord(self)
    389 

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in __init__(self, pool, connect)
    672         if connect:
--> 673             self.__connect()
    674         self.finalize_callback = deque()

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in __connect(self)
    898         except BaseException as e:
--> 899             with util.safe_reraise():
    900                 pool.logger.debug("Error on connect(): %s", e)

/usr/local/lib/python3.12/dist-packages/sqlalchemy/util/langhelpers.py in __exit__(self, type_, value, traceback)
    223             self._exc_info = None  # remove potential circular references
--> 224             raise exc_value.with_traceback(exc_tb)
    225         else:

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in __connect(self)
    894             self.starttime = time.time()
--> 895             self.dbapi_connection = connection = pool._invoke_creator(self)
    896             pool.logger.debug("Created new connection %r", connection)

/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/create.py in connect(connection_record)
    660 
--> 661             return dialect.connect(*cargs, **cparams)
    662 

/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/default.py in connect(self, *cargs, **cparams)
    628         # inherits the docstring from interfaces.Dialect.connect
--> 629         return self.loaded_dbapi.connect(*cargs, **cparams)  # type: ignore[no-any-return]  # NOQA: E501
    630 

/usr/local/lib/python3.12/dist-packages/pymysql/connections.py in __init__(self, user, password, host, database, unix_socket, port, charset, collation, sql_mode, read_default_file, conv, use_unicode, client_flag, cursorclass, init_command, connect_timeout, read_default_group, autocommit, local_infile, max_allowed_packet, defer_connect, auth_plugin_map, read_timeout, write_timeout, bind_address, binary_prefix, program_name, server_public_key, ssl, ssl_ca, ssl_cert, ssl_disabled, ssl_key, ssl_key_password, ssl_verify_cert, ssl_verify_identity, compress, named_pipe, passwd, db)
    364         else:
--> 365             self.connect()
    366 

/usr/local/lib/python3.12/dist-packages/pymysql/connections.py in connect(self, sock)
    722                     print(exc.traceback)
--> 723                 raise exc
    724 

OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 99] Cannot assign requested address)")

The above exception was the direct cause of the following exception:

OperationalError                          Traceback (most recent call last)
/tmp/ipython-input-2522821660.py in <cell line: 0>()
     16 # Jalankan query
     17 mysql_query = "SELECT * FROM iris;"
---> 18 df_mysql = pd.read_sql(mysql_query, mysql_engine)
     19 
     20 # Print hasil

/usr/local/lib/python3.12/dist-packages/pandas/io/sql.py in read_sql(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize, dtype_backend, dtype)
    702     assert dtype_backend is not lib.no_default
    703 
--> 704     with pandasSQL_builder(con) as pandas_sql:
    705         if isinstance(pandas_sql, SQLiteDatabase):
    706             return pandas_sql.read_query(

/usr/local/lib/python3.12/dist-packages/pandas/io/sql.py in pandasSQL_builder(con, schema, need_transaction)
    904 
    905     if sqlalchemy is not None and isinstance(con, (str, sqlalchemy.engine.Connectable)):
--> 906         return SQLDatabase(con, schema, need_transaction)
    907 
    908     adbc = import_optional_dependency("adbc_driver_manager.dbapi", errors="ignore")

/usr/local/lib/python3.12/dist-packages/pandas/io/sql.py in __init__(self, con, schema, need_transaction)
   1634             self.exit_stack.callback(con.dispose)
   1635         if isinstance(con, Engine):
-> 1636             con = self.exit_stack.enter_context(con.connect())
   1637         if need_transaction and not con.in_transaction():
   1638             self.exit_stack.enter_context(con.begin())

/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/base.py in connect(self)
   3275         """
   3276 
-> 3277         return self._connection_cls(self)
   3278 
   3279     def raw_connection(self) -> PoolProxiedConnection:

/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/base.py in __init__(self, engine, connection, _has_events, _allow_revalidate, _allow_autobegin)
    143                 self._dbapi_connection = engine.raw_connection()
    144             except dialect.loaded_dbapi.Error as err:
--> 145                 Connection._handle_dbapi_exception_noconnection(
    146                     err, dialect, engine
    147                 )

/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/base.py in _handle_dbapi_exception_noconnection(cls, e, dialect, engine, is_disconnect, invalidate_pool_on_disconnect, is_pre_ping)
   2438         elif should_wrap:
   2439             assert sqlalchemy_exception is not None
-> 2440             raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
   2441         else:
   2442             assert exc_info[1] is not None

/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/base.py in __init__(self, engine, connection, _has_events, _allow_revalidate, _allow_autobegin)
    141         if connection is None:
    142             try:
--> 143                 self._dbapi_connection = engine.raw_connection()
    144             except dialect.loaded_dbapi.Error as err:
    145                 Connection._handle_dbapi_exception_noconnection(

/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/base.py in raw_connection(self)
   3299 
   3300         """
-> 3301         return self.pool.connect()
   3302 
   3303 

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in connect(self)
    445 
    446         """
--> 447         return _ConnectionFairy._checkout(self)
    448 
    449     def _return_conn(self, record: ConnectionPoolEntry) -> None:

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in _checkout(cls, pool, threadconns, fairy)
   1262     ) -> _ConnectionFairy:
   1263         if not fairy:
-> 1264             fairy = _ConnectionRecord.checkout(pool)
   1265 
   1266             if threadconns is not None:

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in checkout(cls, pool)
    709             rec = cast(_ConnectionRecord, pool._do_get())
    710         else:
--> 711             rec = pool._do_get()
    712 
    713         try:

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/impl.py in _do_get(self)
    175                 return self._create_connection()
    176             except:
--> 177                 with util.safe_reraise():
    178                     self._dec_overflow()
    179                 raise

/usr/local/lib/python3.12/dist-packages/sqlalchemy/util/langhelpers.py in __exit__(self, type_, value, traceback)
    222             assert exc_value is not None
    223             self._exc_info = None  # remove potential circular references
--> 224             raise exc_value.with_traceback(exc_tb)
    225         else:
    226             self._exc_info = None  # remove potential circular references

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/impl.py in _do_get(self)
    173         if self._inc_overflow():
    174             try:
--> 175                 return self._create_connection()
    176             except:
    177                 with util.safe_reraise():

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in _create_connection(self)
    386         """Called by subclasses to create a new ConnectionRecord."""
    387 
--> 388         return _ConnectionRecord(self)
    389 
    390     def _invalidate(

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in __init__(self, pool, connect)
    671         self.__pool = pool
    672         if connect:
--> 673             self.__connect()
    674         self.finalize_callback = deque()
    675 

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in __connect(self)
    897             self.fresh = True
    898         except BaseException as e:
--> 899             with util.safe_reraise():
    900                 pool.logger.debug("Error on connect(): %s", e)
    901         else:

/usr/local/lib/python3.12/dist-packages/sqlalchemy/util/langhelpers.py in __exit__(self, type_, value, traceback)
    222             assert exc_value is not None
    223             self._exc_info = None  # remove potential circular references
--> 224             raise exc_value.with_traceback(exc_tb)
    225         else:
    226             self._exc_info = None  # remove potential circular references

/usr/local/lib/python3.12/dist-packages/sqlalchemy/pool/base.py in __connect(self)
    893         try:
    894             self.starttime = time.time()
--> 895             self.dbapi_connection = connection = pool._invoke_creator(self)
    896             pool.logger.debug("Created new connection %r", connection)
    897             self.fresh = True

/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/create.py in connect(connection_record)
    659                         return connection
    660 
--> 661             return dialect.connect(*cargs, **cparams)
    662 
    663         creator = pop_kwarg("creator", connect)

/usr/local/lib/python3.12/dist-packages/sqlalchemy/engine/default.py in connect(self, *cargs, **cparams)
    627     def connect(self, *cargs: Any, **cparams: Any) -> DBAPIConnection:
    628         # inherits the docstring from interfaces.Dialect.connect
--> 629         return self.loaded_dbapi.connect(*cargs, **cparams)  # type: ignore[no-any-return]  # NOQA: E501
    630 
    631     def create_connect_args(self, url: URL) -> ConnectArgsType:

/usr/local/lib/python3.12/dist-packages/pymysql/connections.py in __init__(self, user, password, host, database, unix_socket, port, charset, collation, sql_mode, read_default_file, conv, use_unicode, client_flag, cursorclass, init_command, connect_timeout, read_default_group, autocommit, local_infile, max_allowed_packet, defer_connect, auth_plugin_map, read_timeout, write_timeout, bind_address, binary_prefix, program_name, server_public_key, ssl, ssl_ca, ssl_cert, ssl_disabled, ssl_key, ssl_key_password, ssl_verify_cert, ssl_verify_identity, compress, named_pipe, passwd, db)
    363             self._sock = None
    364         else:
--> 365             self.connect()
    366 
    367     def __enter__(self):

/usr/local/lib/python3.12/dist-packages/pymysql/connections.py in connect(self, sock)
    721                 if DEBUG:
    722                     print(exc.traceback)
--> 723                 raise exc
    724 
    725             # If e is neither DatabaseError or IOError, It's a bug.

OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 99] Cannot assign requested address)")
(Background on this error at: https://sqlalche.me/e/20/e3q8)

image.png

  1. Apabila koneksi berhasil, pilih tabel atau data yang akan di tarik dan pilih “Load” untuk menarik data. image.png

Langkah-langkah menarik data PostgreSQL#

  1. Install library yang digunakan untuk mengquery data dari postgre yang di antaranya Pandas, psycopg2-binary, dan sqlalchemy pada environment PC/Laptop. pandas biasanya digunakan untuk mengolah dan menyajikan data dalam bentuk dataframe yang akan diperlukan oleh Power BI, psycopg2-binary merupakan driver khusus database Postgre yang digunakan untuk berkomunikasi dengan database, sedangkan sqlalchemy merupakan ibarat sebuah jembatan untuk koneksi database.

  2. Massuk ke Power BI, pilih Get Data pada menu Home untuk mendapatkan data image.png

  1. Pada menu Get Data pilih Other -> Pyhton Script, kemudian klik Connect image.png

  1. Masukkan script python untuk mengambil data iris yang ada di database PostgreSQL. berikut script nya :

import pandas as pd
from sqlalchemy import create_engine

# Koneksi ke PostgreSQL
PG_HOST = "localhost"
PG_PORT = 5432
PG_USER = "postgres"
PG_PASSWORD = "psd"
PG_DATABASE = "postgres"


# Gunakan SQLAlchemy untuk koneksi ke PostgreSQL
pg_engine = create_engine(
    f"postgresql+psycopg2://{PG_USER}:{PG_PASSWORD}@{PG_HOST}:{PG_PORT}/{PG_DATABASE}"
)

# Jalankan query
pg_query = "SELECT * FROM iris;"
df_postgres = pd.read_sql(pg_query, pg_engine)

# Print hasil
print("\nData dari PostgreSQL:")
print(df_postgres.head())

image.png

  1. Apabila koneksi berhasil, pilih tabel atau data yang akan di tarik dan pilih “Load” untuk menarik data. image.png

Menggabuangkan Data di Power BI Menggunakan Transform Data#

Langkah-langkah menggabungkan data#

  1. Pada menu Home pilih Transform Data image.png

  1. Setelah itu pada menu home sebelah kanan pilih Combine -> Merge Queries -> Merge Queries as New image.png

  1. Pilih tabel yang akan digabungkan dengan memilih tabel pada dropdown. image.png

  1. Pilih kolom yang akan digabungkan, pada dataset iris data memiliki id yang sama disebabkan jumlah data yang sama, sehingga untuk menggabungkannya cukup menggunakan inner join, konsep inner join akan menggabungkan data yang memiliki id yang sama. Setelah memilih kolom klik Ok untuk melanjutkan proses. image.png

  1. Kemudian akan muncul tabel hasil penggabungan, pada kolom yang digabungkan klik tanda panah untuk menyeleksi kolom apa saja yang akan digabungkan. image.png

  1. Setelah kolom berhasil digabung klik Close & Apply di pojok kiri atas image.png

Mendeteksi Outlier#

Langkah-langkah mendeteksi outlier menggunakan library pycaret#

  1. Install library Pycaret ke environment Python di PC/Laptop. image.png

  1. Pada Power BI ketika kita menggunakan script Python yang akan diterapkan pada suatu tabel seringkali mendapatkan suatu masalah pembatasan. Oleh karena itu solusinya kita menonaktifkannya pada menu File -> Options and Settings -> Option -> Privacy dan pilih Always ignore Privacy Level Settings. image.png

  1. Pada Power BI, pergi ke Menu Home -> Transform Data -> Transform -> Script Python di pojok kanan atas. image.png

  1. Masukkan Script Python yang digunakan untuk mendeteksi Outlier data.

import pandas as pd
from pycaret.anomaly import setup, create_model, assign_model

#mengambil data berbasis dataframe
data = dataset.copy()

process = setup(data, session_id=123)

#memilih model outlier
model = create_model('iforest')

#hasil
result = assign_model(model)
result

Penjelasan code:

  • Pertama kita import librray yang dibutuhkan seperti pandas dan pycaret.

  • Kemudian Load dataset menggunakan libray pandas dengan method copy().

  • lalu gunakan built in function setup untuk memulai proses.

  • Pilih model yang digunakan untuk mendeteksi outlier, pada code tersebut menggunakan model iforest.

  • tampilkan hasil menggunakan fungsi assign_model.

Load hasil

image.png

  1. Setelah berhasil meload script, akan muncul tabel yang berisi data di antaranya data, dataset, dan result. Kemudian pilih result dan klik tulisan Table untuk melihat oulier yang telah diproses. image.png

  1. Untuk data yang outlier direpresentasikan dengan nilai 1 dan 0 untuk data yang bukan oulier. image.png

Berdasarkan gambar di atas terlihat bahwa jumlah outlier ditemukan pada data adalah 8 data.

Mencari Missing Value#

Langkah-langkah mencari missing value#

  1. Install library yang dibutuhkan untuk mencari missing value seperti pandas.

  2. Buka Power BI, kemudian pergi ke menu Home -> Transform Data -> Transform -> Run Python Script disebalah kanan atas. image.png

  1. Kemudian Buat scipt Python untuk mendeteksi Missing Value.

import pandas as pd

# load data
data = dataset.copy()

# cari missing value
loss = data.isnull().sum()

# hasil
result = pd.DataFrame({
    'Column': loss.index,
    'MissingCount': loss.values
})
result

Penjelasan Code:

  • import library yang digunakan misalnya pandas.

  • Kemudian load data menggunkan metod copy()

  • Setelah itu, untuk mencari data missing dapat menggunakan method isnull() dan sum() untuk menjumlahkan total missingnya.

  • Simpan Hasil dalam variabel yang berupa dataframe yang berisi indeks dari nilai missing dan nilai data atau veluenya.

image.png

  1. Ketika sudah muncul hasil script Python, pilih data result dan klik Table untuk melihat hasil dari pencarian missing valuenya. image.png

  1. hasil dari pencarian missing value pada data Iris. image.png

Berdasarkan gambar tersebut dapat disimpulkan bahwa setiap fitur tidak memiliki missing value.

Mendeteksi Outlier Menggunakan Model ABOD#

Tahapan-tahapann deteksi outlier#

  1. Buka Power BI, kemudian pergi ke menu Home -> Transform Data -> Transform -> Run Python Script disebalah kanan atas. image.png

  1. Masukkan Script Python yang digunakan untuk mendeteksi outlier data.

import pandas as pd
from pycaret.anomaly import *

data = dataset.copy()
process = setup(data, session_id=123)
model = create_model('abod')
result = assign_model(model)

data_anomaly = result[result['Anomaly']==1]
data_anomaly

Penjelasan code:

  • import pandas as pd: Mengimpor library pandas yang digunakan untuk mengelola data dalam format tabel (DataFrame).

  • from pycaret.anomaly import : Mengimpor semua fungsi dari modul anomaly dalam library PyCaret, yang khusus digunakan untuk deteksi anomali.

  • data = dataset.copy(): Membuat salinan (copy) dari dataset asli ke variabel baru bernama data. Ini dilakukan agar dataset asli tidak berubah selama proses.

  • process = setup(data, session_id=123): Menyiapkan lingkungan PyCaret. Fungsi setup melakukan pra-pemrosesan data secara otomatis, seperti normalisasi dan penanganan nilai kosong. session_id digunakan agar hasil eksperimen dapat direproduksi.

  • model = create_model(‘abod’): Melatih model deteksi anomali. ‘abod’ adalah singkatan dari Angle-Based Outlier Detection, salah satu algoritma yang digunakan untuk menemukan titik data yang “aneh”.

  • result = assign_model(model): Menerapkan model yang sudah dilatih ke data. Fungsi ini menambahkan dua kolom baru: Anomaly (yang berisi 1 jika anomali dan 0 jika bukan) dan Anomaly_Score (skor anomali).

  • data_anomaly = result[result[‘Anomaly’]==1]: Menyaring (memfilter) result DataFrame. Kode ini hanya mengambil baris-baris di mana nilai pada kolom Anomaly sama dengan 1, yaitu baris yang dianggap sebagai anomali.

  • data_anomaly: Menampilkan DataFrame baru yang hanya berisi baris-baris data anomali.

image.png

  1. Terdapat 4 tabel yang dihasilkan dari python script tadi, dari tabel tersebut pilih tabel data_anomaly untuk melihat outlier dari data iris image.png

  1. Berikut isi tabel data_anomaly image.png

Berdasarkan gambar di atas terlihat bahwa jumlah outlier ditemukan pada data adalah 8 data.

Mendeteksi Outlier Menggunakan Model KNN#

Tahapan-tahapann deteksi outlier#

  1. Buka Power BI, kemudian pergi ke menu Home -> Transform Data -> Transform -> Run Python Script disebalah kanan atas. image.png

  1. Masukkan Script Python yang digunakan untuk mendeteksi outlier data.

import pandas as pd
from pycaret.anomaly import *

data = dataset.copy()
process = setup(data, session_id=123)
model = create_model('knn')
result = assign_model(model)

data_anomaly = result[result['Anomaly']==1]
data_anomaly

Penjelasan code:

  • import pandas as pd: Mengimpor library pandas yang digunakan untuk mengelola data dalam format tabel (DataFrame).

  • from pycaret.anomaly import : Mengimpor semua fungsi dari modul anomaly dalam library PyCaret, yang khusus digunakan untuk deteksi anomali.

  • data = dataset.copy(): Membuat salinan (copy) dari dataset asli ke variabel baru bernama data. Ini dilakukan agar dataset asli tidak berubah selama proses.

  • process = setup(data, session_id=123): Menyiapkan lingkungan PyCaret. Fungsi setup melakukan pra-pemrosesan data secara otomatis, seperti normalisasi dan penanganan nilai kosong. session_id digunakan agar hasil eksperimen dapat direproduksi.

  • model = create_model(‘knn’): Melatih model deteksi anomali. ‘knn’ adalah singkatan dari k-Nearest Neighbors, salah satu algoritma yang umum digunakan untuk mengidentifikasi anomali dengan melihat jarak terdekat antar titik data.

  • result = assign_model(model): Menerapkan model yang sudah dilatih ke data. Fungsi ini menambahkan dua kolom baru: Anomaly (yang berisi 1 jika anomali dan 0 jika bukan) dan Anomaly_Score (skor anomali).

  • data_anomaly = result[result[‘Anomaly’]==1]: Menyaring (memfilter) result DataFrame. Kode ini hanya mengambil baris-baris di mana nilai pada kolom Anomaly sama dengan 1, yaitu baris yang dianggap sebagai anomali.

  • data_anomaly: Menampilkan DataFrame baru yang hanya berisi baris-baris data anomali.

image.png

  1. Terdapat 4 tabel yang dihasilkan dari python script tadi, dari tabel tersebut pilih tabel data_anomaly untuk melihat outlier dari data iris image.png

  1. Berikut isi tabel data_anomaly image.png

Berdasarkan gambar di atas terlihat bahwa jumlah outlier ditemukan pada data adalah 8 data.

Mendeteksi Outlier Menggunakan Model LOF#

Tahapan-tahapann deteksi outlier#

  1. Buka Power BI, kemudian pergi ke menu Home -> Transform Data -> Transform -> Run Python Script disebalah kanan atas. image.png

  1. Masukkan Script Python yang digunakan untuk mendeteksi outlier data.

import pandas as pd
from pycaret.anomaly import *

data = dataset.copy()
process = setup(data, session_id=123)
model = create_model('lof')
result = assign_model(model)

data_anomaly = result[result['Anomaly']==1]
data_anomaly

Penjelasan code:

  • import pandas as pd: Mengimpor library pandas yang digunakan untuk mengelola data dalam format tabel (DataFrame).

  • from pycaret.anomaly import : Mengimpor semua fungsi dari modul anomaly dalam library PyCaret, yang khusus digunakan untuk deteksi anomali.

  • data = dataset.copy(): Membuat salinan (copy) dari dataset asli ke variabel baru bernama data. Ini dilakukan agar dataset asli tidak berubah selama proses.

  • process = setup(data, session_id=123): Menyiapkan lingkungan PyCaret. Fungsi setup melakukan pra-pemrosesan data secara otomatis, seperti normalisasi dan penanganan nilai kosong. session_id digunakan agar hasil eksperimen dapat direproduksi.

  • model = create_model(‘lof’): Melatih model deteksi anomali menggunakan algoritma Local Outlier Factor (LOF). Algoritma ini mengukur seberapa terisolasi suatu titik data dari lingkungannya..

  • result = assign_model(model): Menerapkan model yang sudah dilatih ke data. Fungsi ini menambahkan dua kolom baru: Anomaly (yang berisi 1 jika anomali dan 0 jika bukan) dan Anomaly_Score (skor anomali).

  • data_anomaly = result[result[‘Anomaly’]==1]: Menyaring (memfilter) result DataFrame. Kode ini hanya mengambil baris-baris di mana nilai pada kolom Anomaly sama dengan 1, yaitu baris yang dianggap sebagai anomali.

  • data_anomaly: Menampilkan DataFrame baru yang hanya berisi baris-baris data anomali.

image.png

  1. Terdapat 4 tabel yang dihasilkan dari python script tadi, dari tabel tersebut pilih tabel data_anomaly untuk melihat outlier dari data iris image.png

  1. Berikut isi tabel data_anomaly image.png

Berdasarkan gambar di atas terlihat bahwa jumlah outlier ditemukan pada data adalah 8 data.